package com.atguigu.linkedlist;

//import com.sun.java.util.jar.pack.ConstantPool;

/**
 * @author shkstart
 * @create 2021-09-27 18:47
 */


public class ArrayList< T > {
    //线性表容量默认长度
    private final int DEFAULT_LENGTH = 10;
    //线性表数据长度
    private int length = 0;
    //线性表的数据
    private Object[] data;


    public ArrayList( ) {
        this.data = new Object[ DEFAULT_LENGTH ];
    }

    /**
     * 线性表新增方法,如果线性表内容长度等于容量长度,则扩容
     *
     * @param o
     */
    public void add( T o ) {
        if( this.data.length == this.length ) {
            Object[] objects = new Object[ this.data.length * 2 ];
            //this.data:需要拷贝的目标数组;
            // 0:目标数据拷贝的起始下标;
            // Objects:拷贝到的数组对象;
            // 0:拷贝到的数组对象从哪儿增加拷贝数据;
            // this.data.length:拷贝数据的长度!
            System.arraycopy( this.data, 0, objects, 0, this.data.length );
            this.data = objects;
        }
        this.data[ this.length++ ] = o;
    }

    /**
     * 删除并将删除的数据返回
     *
     * @param index
     * @return
     */
    public T remove( int index ) {
        if(index< 0 || index >= this.length ) {
            throw new ArrayIndexOutOfBoundsException( "数组越界!" );
        }
        T t = ( T ) this.data[ index ];
        while( index < this.length - 1 ) {
            this.data[ index ] = this.data[ ++index ];
        }
        this.length--;
        return t;
    }

    /**
     * 查找指定索引数据
     *
     * @param i
     * @return
     */
    public T get( int i ) {
        if(i< 0 || i >= this.length ) {
            throw new ArrayIndexOutOfBoundsException( "数组越界!" );
        }

        return ( T ) this.data[ i ];
    }

    /**
     * 获取数据长度
     *
     * @return
     */
    public int length( ) {
        return this.length;
    }

    @Override
    public String toString( ) {
        StringBuilder stringBuffer = new StringBuilder( "[" );
        for( int i = 0 ; i < this.length ; i++ ) {
            stringBuffer.append( this.data[ i ] );
            if( i < this.length - 1 ) {
                stringBuffer.append( "," );
            }
        }
        stringBuffer.append( "]" );
        return stringBuffer.toString( );
    }
    //测试方法
    public static void main(String[] args) {
        ArrayList< Integer > integerArrayList = new ArrayList<>( );

        integerArrayList.add( 1 );
        integerArrayList.add( 2 );
        integerArrayList.add( 3 );
        integerArrayList.add( 4 );
        integerArrayList.add( 5 );
        integerArrayList.add( 6 );
        integerArrayList.add( 7 );
        integerArrayList.add( 8 );
        integerArrayList.add( 9 );
        integerArrayList.add( 10 );
        integerArrayList.add( 11 );


        System.out.println("初始化数据"+ integerArrayList.toString());

        System.err.println("获取的数据数据："+integerArrayList.get( 1 ) );
        integerArrayList.remove( 0 );
        System.out.println("删除数据后的数据："+integerArrayList.toString());


        System.out.println("数据的长度："+integerArrayList.length());


    }
}

